home *** CD-ROM | disk | FTP | other *** search
- #ifndef H_OOFREL
- #define H_OOFREL
- // COPYRIGHT 1994 A.D. Software, All rights reserved
-
- // public layer of OOFILE database
-
- #include "oof2.hpp"
-
- class dbRelRefBase : public dbClass, public OOF_mixRelChainEndPoint
- {
- public:
- dbRelRefBase(dbRelHalf* ref=0, unsigned long maxLinks=0) :
- mThisLinkRelHalf(ref),
- mMinLinks(0),
- mMaxLinks(maxLinks)
- {};
-
- void newRecord();
- // recordwise access
- void start();
- bool more();
- void next();
- unsigned long count();
- bool gotoRelativeRecord(unsigned long);
-
- protected:
- void LogTransition();
- void BuildRelChainToTable();
- dbTable* RefersToTable();
- void SetRelHalfByWhichWeNavigate(dbRelHalf*);
- // data storage
- dbRelHalf* mThisLinkRelHalf;
- unsigned long mMinLinks, mMaxLinks;
- friend class dbRelHalf;
- };
-
-
- class dbRelRef : public dbRelRefBase
- {
- public:
- dbRelRef(dbRelHalf* ref=0) : dbRelRefBase(ref, 1 /* only 1 related value allowed */) {};
- };
-
-
- class dbRelSet : public dbRelRefBase
- {
- public:
- dbRelSet(dbRelHalf* ref=0) : dbRelRefBase(ref) {};
- };
-
-
-
- class dbRelationship : public dbClass {
- public:
- dbRelationship(dbRelRefBase&, dbRelRefBase&, const char* name=0);
- dbRelationship(dbRelRefBase&, dbRelRefBase&, dbField& joinLeft, dbField& joinRight, const char* name=0);
- dbRelationship(dbRelHalf* lhs=0, dbRelHalf* rhs=0);
- ~dbRelationship();
-
- void buildRelationship();
-
- dbRelationship& names(const char*, const char*);
- dbRelationship& tables(dbTable*, dbTable*);
- dbRelationship& tables(dbTable&, dbTable&);
- dbRelationship& joinFields(dbField*, dbField*);
- dbRelationship& joinFields(dbField&, dbField&);
- void lhsOwnsRHSasParts();
- void rhsOwnsLHSasParts();
-
- void lhs(dbTable*, dbRelRefBase& linkFld, const char*name=0);
- void rhs(dbTable*, dbRelRefBase& linkFld, const char*name=0);
- void lhs(dbTable&, dbRelRefBase& linkFld, const char*name=0);
- void rhs(dbTable&, dbRelRefBase& linkFld, const char*name=0);
- void lhs(dbField* joinOver, dbRelRefBase& linkFld, const char* name=0);
- void rhs(dbField* joinOver, dbRelRefBase& linkFld, const char* name=0);
- void lhs(dbField& joinOver, dbRelRefBase& linkFld, const char* name=0);
- void rhs(dbField& joinOver, dbRelRefBase& linkFld, const char* name=0);
-
- virtual void describe(ostream&);
- void joinsUpdateFields(bool);
-
- protected:
- enum PartSides { neither, lhsIsPart, rhsIsPart };
- // data storage
- dbRelHalf *mlhs, *mrhs;
- OOF_String mName;
- PartSides mPartSides;
- bool mJoinUpdatesJoinField;
-
- public:
- static bool sAllJoinsUpdateJoinField;
-
- friend class dbConnect;
- };
-
-
- class dbRelHalf : public dbClass {
- public:
- dbRelHalf(dbTable* tbl, dbRelRefBase& linkFldPtr, const char* name=0) :
- mTable(tbl),
- mInverseTable(0),
- mLinkfield(linkFldPtr),
- mName(name),
- mJoinField(0),
- mJoinToField(0),
- mPartRelation(false)
- {};
-
- dbRelHalf(dbField* joinOver, dbRelRefBase& linkFldPtr, const char* name=0);
-
- dbRelHalf(dbRelRefBase& linkFldPtr) :
- mTable(0),
- mInverseTable(0),
- mLinkfield(linkFldPtr),
- mName(0),
- mJoinField(0),
- mJoinToField(0),
- mPartRelation(false)
- {};
-
- virtual ~dbRelHalf() {};
-
- void buildRelationship(dbTable* inverseTable);
-
- virtual void describe(ostream&);
- dbTable* relatesToTable() const;
- bool rhsbackendIsThisTable(const OOF_tableBackend*) const;
- void refreshContext(dbTable*);
- void updateJoinField(dbTable*);
- dbRelChain* askTableToBuildValidChain(dbRelChain*);
-
- protected:
- // data storage
- dbTable *mTable, *mInverseTable;
- dbRelRefBase& mLinkfield;
- OOF_String mName;
- dbField *mJoinField, *mJoinToField;
- bool mPartRelation;
- public:
- bool mJoinUpdatesJoinField;
-
- friend class dbRelationship;
- friend class dbTable;
- };
-
-
- class dbRelChain : public OOF_Dictionary {
- public:
- dbRelChain(unsigned int numSlots=1) :
- OOF_Dictionary(numSlots),
- mTablesList(0),
- mContextValid(false)
- {};
- dbRelChain(const dbRelChain&) {assert(0);};
- virtual ~dbRelChain();
- dbRelChain* buildChain();
- void validateContext();
- void baseContextHasChanged();
- void saveRecord();
- void deleteRecord();
- void unloadRecord();
- dbTable* getFinalTable();
- dbField* getFinalField(fieldNumT);
- void newRecord();
- void propagateJoinCopy();
-
- // recordwise access
- void startRelated();
- bool moreRelated();
- void nextRelated();
- unsigned long countRelated();
- bool gotoRelativeRecord(unsigned long);
- bool isStillJustACandidate();
-
- private:
- void ConvertToRealChain();
-
- // data storage
- OOF_DictRep* mTablesList;
- bool mContextValid;
- dbTable* mFinalTable;
-
- friend class dbTable;
- };
-
-
- class OOF_relChainList : public OOF_ExpandableLongArray
- {
- public:
- OOF_relChainList(unsigned long numSlots=2, unsigned int expandBySlots=4) :
- OOF_ExpandableLongArray(0, numSlots, expandBySlots)
- {};
- // access protocol
- void append(const dbRelChain*);
- dbRelChain* match(dbRelChain*);
- void baseContextHasChanged();
- void propagateSave();
- void propagateDelete();
- void propagateUnload();
- };
-
-
-
- // include inline definitions
- #include "oofrel.inl"
- #endif